This document explains how Sugar Cake Animation Framework (SCake) functions and gives useful information.

[> Systems Explainer <]
	SCake features a highly customizable animation system for both animators and users with the goal of allowing animators to take advantage of the full animation montage system in UE5 while still integrating with the game and allowing users to customize and create their own animation events. To better understand the systems let's go over how SCake works. SCake uses what I call "Animation Events", these events consist of various individual animations, known as Animation Slots, combined together in 'stages' with metadata both specific to each animation as well as the animation event as a whole. Each individual animation is registered into SCake within Animation Slots, then Animation Events can be configured to use any Animation Slot. Animators are encouraged to create their own Animation Events that act as a full scene, but this is not required since users will be able to configure those animations into their own events as they desire.

	There are 3 playback modes within SCake, The standard SFW animation player which is used by Angel Cake (the SFW version of the framework), then there's Erotic Animation additions to the standard player which adds additional erotic elements like managing Sexual Pleasure and triggering climax', then there's the interact mode which can play both SFW and Erotic but instead of playing automatically the Start and End of an Interact Event must be triggered by a module using SCake's API/SDK.

	SCake features several different end conditions based on the type of animation being played. A standard animation, which is non-erotic, will play straight through the animation for the determined period of time either set by the user or ended by a module. Interact animations are a bit different where they will play a start stage (if defined for the animation) and continue to loop through stages until the interaction is ended by a module where it will then play an end stage (if defined). When the animation is Erotic, however, the addition of Climax is added in along with a few changes in behavior. Erotic animations will play through just like normal however when characters reach enough Sexual Pleausre they can climax, triggering a temporary switch to a climax animation. For standard erotic animations the user can set an end condition, which if met the animation will move to the end stage which is used as a post-climax animation, but if the animation is an interact it will return to looping until the responsible module ends the interaction and plays the end stage.

	Here's an example when the user has "All Climax" as the requirement to end a standard erotic animation...
		Standard Synced Climax Animation
		: StartStage   : - |
		: Stages       :    - - - - - - |
		: Actor1Climax :
		: Actor2Climax :
		: SyncedClimax :                | - |
		: EndStage     :                    | - END
		
		Individual Climax Animation where Actor 2 orgasms first
		: StartStage   : - |
		: Stages       :   | - - |   | - |
		: Actor1Climax :                 | - |
		: Actor2Climax :         | - |
		: SyncedClimax :
		: EndStage     :                     | - END
		
		Individual Climax Animation where Actor 1 orgasms but Actor 2 does not
		: StartStage   : - |
		: Stages       :   | - - - - |   | - - - END
		: Actor1Climax :             | - |
		: Actor2Climax :
		: SyncedClimax :
		: EndStage     :
		
		No Climax or Non-Erotic Animation
		: StartStage   : - |
		: Stages       :   | - - - - - - - - - - END
		: Actor1Climax :
		: Actor2Climax :
		: SyncedClimax :
		: EndStage     :

	These examples assume automatic (or at least linearly played) animations with a fixed end time, however users can change how events play out.

	All this sounds great, however not all animation packs will feature the full set of animations available, so animations may re-use animations or not feature every case. Some strangeness can also occur if climax animations are not in sync with the animation it is transitioning from, such as switching from doggy style to missionary style, some care should be taken when configuring animations. Also, certain fetishes may not fit into this mold. In these cases where the system doesn't fit your needs you can create custom events using UE5 Anim Montages with SCake Module integration for the desired effect, animations can even store arbitrary string data to reference (This data is stored as a TMap|Name|String, use Name to reference).

[> Physical Gender/Sex Assignment <]
	The base game, as of the time of writing at least, only offers Male/Female for their gender assignments (technically they also have 'none' as a type). However, SCake uses its own Sex Equip Tags system for compatibility checking. By default, SCake will attempt to apply the appropriate tags based on the base-game gender and user settings, for instance a male may have Penis, Mouth, Anus. Additional SEquip tags can be added through the API/SDK so modules and integrations can add additional tags to characters. SCake does not track any 'standard' for gender, however some blocking features are available that make assumptions based on what SEquip tags are present on a character, and tags can be blocked on animations if certain combinations are undesired.

[> Additional Notes <]
	- Proper initial configuration is important, if you're an animator and struggling to configure your animations please contact me or post over on our Discord for help and we can get things rolling! ^-^
	- Although the framework will support automatic sound configurations, custom sounds can be played through the Anim Montage system itself. (Call the SCake Event to play built-in animation sounds)
	- External objects (furniture) can be defined, but are not required.
	- 'Equips' (like toys) can also be applied through Anim Montages and Modules

[> Limitations <]
	- If an Anim Montage has invalid metadata then it can't be registered for use in the framework. Most options will have defaults to fall back on but requirements must be filled.
	- If an Animation Event features an invalid animation it may fail mid-playback and cause undefined behavior, all animations must have valid data and align with all animations in the event.

IMPORTANT NOTE :
	It is important to configure animations and these parameters correctly to provide users the best experience. It's worth learning some of UE5's animation montage features before you begin animating to better understand how these systems can be used.

User Configuration :
	Users will be able to change all animation configurations or even blend stages from different animations together to create their own animation events. This means if something isn't working correctly, this can be adjusted by the user.

-- -- --

[> Aquire in-game information <]

SCake features a few debug features built-in, however to get all data you'd want you may need to ask the community (check out The Broken Chatbox Discord! ^-^) or use/make additional debug scripts. For basic info like CharacterID/BPClass/Scale/ect you can use SCake's debug input to select the desired target then check the debug menu for this info.

[> Pal Internal Names <]

Internally Palworld uses uniqueIDs to identify different pals while a translated FText variable is used for the readable name. I've extracted a list of pals and compiled them here. (In the format of "TranslatedName : InternalName")

Current as of STEAM version 0.4.14.65422

Melpaca : Alpaca
Kitsun : AmaterasuWolf
Kitsun Noct : AmaterasuWolf_Dark
Anubis : Anubis
Nyafia  : BadCatgirl
Incineram : Baphomet
Incineram Noct : Baphomet_Dark
Mau : Bastet
Mau Cryst : Bastet_Ice
Caprity : BerryGoat
Caprity Noct : BerryGoat_Dark
Vanwyrm : BirdDragon
Vanwyrm Cryst : BirdDragon_Ice
Necromus : BlackCentaur
Dragostrophe : BlackFurDragon
Shadowbeak : BlackGriffon
Astegon : BlackMetalDragon
Smokie : BlackPuppy
Prunelia : BlueberryFairy
Azurobe : BlueDragon
Fuack : BluePlatypus
Azurmane : BlueThunderHorse
Rushoar : Boar
Sootseer : CandleGhost
Penking : CaptainPenguin
Lifmunk : Carbunclo
Tombat : CatBat
Katress : CatMage
Katress Ignis : CatMage_Fire
Felbat : CatVampire
Chikipi : ChickenPal
Tocotoco : ColorfulBird
Mozzarina : CowPal
Cinnamoth : CuteButterfly
Vixy : CuteFox
Fuddler : CuteMole
Xenovader : DarkAlien
Cawgnito : DarkCrow
Xenolord  : DarkMechaDragon
Menasting : DarkScorpion
Menasting Terra : DarkScorpion_Ground
Eikthyrdeer : Deer
Eikthyrdeer Terra : Deer_Ground
Daedream : DreamDemon
Digtoise : DrillGame
Galeclaw : Eagle
Sparkit : ElecCat
Boltmane : ElecLion
Grizzbolt : ElecPanda
Elphidran : FairyDragon
Elphidran Aqua : FairyDragon_Water
Dazemu : FeatherOstrich
Fenglope : FengyunDeeper
Fenglope Lux : FengyunDeeper_Electric
Pyrin : FireKirin
Pyrin Noct : FireKirin_Dark
Rooby : FlameBambi
Arsox : FlameBuffalo
Dinossom : FlowerDinosaur
Dinossom Lux : FlowerDinosaur_Electric
Petallia : FlowerDoll
Flopie : FlowerRabbit
Celaray : FlyingManta
Wixen : FoxMage
Wixen Noct : FoxMage_Dark
Teafant : Ganesha
Direhowl : Garm
Maraith : GhostBeast
Nitemary : GhostRabbit
Gildane : GoldenHorse
Gorirat : Gorilla
Gorirat Terra : Gorilla_Ground
Mammorest : GrassMammoth
Mammorest Cryst : GrassMammoth_Ice
Mossanda : GrassPanda
Mossanda Lux : GrassPanda_Electric
Verdash : GrassRabbitMan
Splatterina : GrimGirl
Yakumo : GuardianDog
Helzephyr : HadesBird
Helzephyr Lux : HadesBird_Electric
Nitewing : HawkBird
Jolthog : Hedgehog
Jolthog Cryst : Hedgehog_Ice
Warsect  : HerculesBeetle
Warsect Terra : HerculesBeetle_Ground
Faleris : Horus
Faleris Aqua : Horus_Water
Reindrix : IceDeer
Foxcicle : IceFox
Frostallion : IceHorse
Frostallion Noct : IceHorse_Dark
Jetragon : JetDragon
Kelpsea : Kelpie
Kelpsea Ignis : Kelpie_Fire
Croajiro : KendoFrog
Kingpaca : KingAlpaca
Kingpaca Cryst : KingAlpaca_Ice
Blazamut : KingBahamut
Blazamut Ryu : KingBahamut_Dragon
Univolt : Kirin
Foxparks : Kitsunebi
Foxparks Cryst : Kitsunebi_Ice
Flambelle : LavaGirl
Dumud : LazyCatfish
Relaxaurus : LazyDragon
Relaxaurus Lux : LazyDragon_Electric
Lullu : LeafPrincess
Lyleen : LilyQueen
Lyleen Noct : LilyQueen_Dark
Bristla : LittleBriarRose
Leezpunk : LizardMan
Leezpunk Ignis : LizardMan_Fire
Blazehowl : Manticore
Blazehowl Noct : Manticore_Dark
Mimog : MimicDog
Tanzee : Monkey
Selyne : MoonQueen
Swee : MopBaby
Sweepa : MopKing
Shroomer : MushroomDragon
Shroomer Noct : MushroomDragon_Dark
Lunaris : Mutant
Omascul : MysteryMask
Grintale : NaughtyCat
Depresso : NegativeKoala
Killamari : NegativeOctopus
Starryon : NightBlueHorse
Nox : NightFox
Bellanoir : NightLady
Bellanoir Libero : NightLady_Dark
Pengullet : Penguin
Cattiva : PinkCat
Lovander : PinkLizard
Ribbuny : PinkRabbit
Ribbuny Botan : PinkRabbit_Grass
Gumoss : PlantSlime
Tarantriss : PurpleSpider
Elizabee : QueenBee
Dazzi : RaijinDaughter
Dazzi Noct : RaijinDaughter_Water
Ragnahawk : RedArmorBird
Robinquill : RobinHood
Robinquill Terra : RobinHood_Ground
Bushi : Ronin
Bushi Noct : Ronin_Dark
Paladius : SaintCentaur
Broncherry : SakuraSaurus
Broncherry Aqua : SakuraSaurus_Water
Prixter : ScorpionMan
Surfent : Serpent
Surfent Terra : Serpent_Ground
Gobfin : SharkKid
Gobfin Ignis : SharkKid_Fire
Lamball : SheepBall
Dogen : SifuDog
Quivern : SkyDragon
Quivern Botan : SkyDragon_Grass
Kikit : SmallArmadillo
Bastigor : SnowTigerBeastman
Beegarde : SoldierBee
Suzaku : Suzaku
Suzaku Aqua : Suzaku_Water
Woolipop : SweetsSheep
Beakon : ThunderBird
Rayhound : ThunderDog
Orserk : ThunderDragonMan
Jormuntide : Umihebi
Jormuntide Ignis : Umihebi_Fire
Vaelet : VioletFairy
Reptyro : VolcanicMonster
Reptyro Cryst : VolcanicMonster_Ice
Chillet : WeaselDragon
Chillet Ignis : WeaselDragon_Fire
Loupmoon : Werewolf
Loupmoon Cryst : Werewolf_Ice
Xenogard : WhiteAlienDragon
Celesdir : WhiteDeer
Sibelyx : WhiteMoth
Silvegis : WhiteShieldDragon
Cryolinx : WhiteTiger
Cryolinx Terra : WhiteTiger_Ground
Hangyu : Windchimes
Hangyu Cryst : Windchimes_Ice
Knocklem : WingGolem
Hoocrates : WizardOwl
Cremis : WoolFox
Wumpo : Yeti
Wumpo Botan : Yeti_Grass
Zoe & Grizzbolt : GrassBoss
Lily & Lyleen : ForestBoss
Marcus & Faleris : DessertBoss
Axel & Orserk : VolcanoBoss
Victor & Shadowbeak : SnowBoss
Saya & Selyne : SakurajimaBoss
Bjorn & Bastigor : VikingBoss